home *** CD-ROM | disk | FTP | other *** search
- /*
- shakershell.c
-
- Author: Paul Baxter.
-
- This sort is a combination of a shaker sort and a shell sort.
- This was written just for test purposes only. This is a not a
- standard sort.
-
- Here is how it works:
-
- 1) Set gap as number of data / 2.
- 2) Start an incrementing loop (index) from 0 to number of data - gap.
- 3) Compare index data item to index + gap data item.
- 4) If index data item greater than index + gap data item swap and set flag.
- 5) End loop.
- 6) If swap flag == false goto 12.
- 7) Start an decrementing loop (index) from number of data - gap -1 to 1.
- 8) Compare index data item to index - gap data item.
- 9) If index data item greater than index + gap data item swap and set flag.
- 10) End loop.
- 11) If swap flag == true then goto 2.
- 12) Set gap to gap / 2.
- 13) If gap > 0 then goto 2.
- 14) End.
- */
-
- #ifndef THINK_C
- #include <Types.h>
- #endif
-
- #include "sortdata.h"
-
- void main(long maxdata, long* sortdata, swp sw, cmp cm, short* stopflag);
-
- void main(long maxdata, long* sortdata, swp sw, cmp cm, short* stopflag)
- {
- long gap, index, select, *pindex, *pselect;
- Boolean swaped;
- gap = maxdata >> 1;
- while (gap > 0) {
- do {
- swaped = false;
- pindex = sortdata;
- select = gap;
- pselect = &sortdata[gap];
- for (index = 0; index < maxdata - gap; index++, pindex++, select++, pselect++) {
-
- if (*stopflag) {
- return;
- }
-
- if ((*cm)(index, select, *pindex, *pselect) > 0) {
- (*sw)(index, select, pindex, pselect);
- swaped = true;
- }
- }
- if (swaped) {
- swaped = false;
- index = select - 1;
- pindex = pselect - 1;
- select = index - gap;
- pselect = &sortdata[select];
- for (; select > 0; index--, pindex--, select--, pselect--) {
- if (*stopflag) {
- return;
- }
-
- if ((*cm)(index, select, *pindex, *pselect) < 0) {
- (*sw)(index, select, pindex, pselect);
- swaped = true;
- }
- }
- }
- } while (swaped);
- gap >>= 1;
- }
- }
-